package com.atguigu.tingshu.user.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.common.util.MongoUtil;
import com.atguigu.tingshu.model.user.UserListenProcess;
import com.atguigu.tingshu.user.service.UserListenProcessService;
import com.atguigu.tingshu.vo.user.UserListenProcessVo;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class UserListenProcessServiceImpl implements UserListenProcessService {

	@Autowired
	private MongoTemplate mongoTemplate;

	@Autowired
	private RabbitService rabbitService;


	@Autowired
	private RedisTemplate redisTemplate;

	/**
	 * 根据音频声音ID获取用户的播放中断时间
	 *
	 * 此方法用于从MongoDB中查询用户在特定音频声音上的播放中断时间（即用户上次停止播放的时间）
	 * 如果用户没有对该音频进行播放，或者没有中断播放记录，则返回0.00
	 *
	 * @param trackId 音频声音ID，用于标识特定的音频
	 * @return 返回用户在该音频上的播放中断时间，如果没有记录则返回0.00
	 */
	@Override
	public BigDecimal getTrackBreakSecond(Long trackId) {

		//获取当前用户的ID
		Long userId = AuthContextHolder.getUserId();

		//1.构建条件对象
		//构造一个查询条件，匹配用户ID和音频声音ID
		Criteria criteria = Criteria.where("userId").is(userId)
				.and("trackId").is(trackId);

		//2.构造一个查询对象
		//使用之前构建的条件对象创建一个查询对象
		Query query = new Query(criteria);

		//3.查询
		//传入枚举值和用户ID计算获取集合名
		//根据用户ID和集合枚举值计算出用户播放记录所在的集合名称
		String collectionName = MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId);

		//从MongoDB中查询用户对特定音频的播放进度
		//使用mongoTemplate执行查询操作，获取用户在指定音频上的播放进度记录
		UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, collectionName);
		//如果查询结果为空，则返回0.00
		if (userListenProcess == null) {
			return new BigDecimal("0.00");
		}
		//返回播放进度
		//如果查询到播放记录，则返回用户上次播放中断的时间
		return userListenProcess.getBreakSecond();
	}

	@Override
	public void updateListenProcess(UserListenProcessVo userListenProcessVo) {
		//1.获取用户ID
		Long userId = AuthContextHolder.getUserId();
		//2.构建条件对象

		Criteria criteria = Criteria.where("userId").is(userId)
				.and("trackId").is(userListenProcessVo.getTrackId());
		//3.构建更新对象
		Query query = new Query(criteria);

		//4.查询
		String collectionName = MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId);
		UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, collectionName);
		if (userListenProcess == null) {
			UserListenProcess listenProcess = new UserListenProcess();
			listenProcess.setUserId(userId);
			listenProcess.setAlbumId(userListenProcessVo.getAlbumId());
			listenProcess.setTrackId(userListenProcessVo.getTrackId());
			listenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
			listenProcess.setIsShow(1);
			listenProcess.setCreateTime(new Date());
			listenProcess.setUpdateTime(new Date());
			mongoTemplate.insert(listenProcess, collectionName);
		} else {

			userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
			userListenProcess.setUpdateTime(new Date());
			mongoTemplate.save(userListenProcess, collectionName);
		}
		//5.更新MySQL中声音的播放量(异步发消息给下游专辑微服务更新专辑和声音的播放量)
		String bitmapKey = new DateTime().toString("yyyyMMdd")+":"+userListenProcessVo.getTrackId();
		Boolean b = redisTemplate.opsForValue().setBit(bitmapKey, userId, true);
		if (!b){
			//持久化该bitmapKey，设置过期时间，一天
			redisTemplate.expire(bitmapKey, 1, TimeUnit.DAYS);
			//当前用户第一次播放该声音
			//发送消息给专辑微服务更新专辑和声音的播放量
			rabbitService.sendMessage(MqConst.EXCHANGE_TRACK, MqConst.ROUTING_TRACK_STAT_UPDATE, JSONObject.toJSONString(userListenProcessVo));
		}
	}

	/**
	 * 获取用户最近播放声音
	 *
	 * @return 返回一个包含用户最近播放声音信息的HashMap对象
	 */
    @Override
    public HashMap<String, Object> getLatelyTrack() {
		HashMap<String, Object> result = new HashMap<>();
		//获取当前用户的ID
		Long userId = AuthContextHolder.getUserId();
		//1.构建条件对象
		//构造一个查询条件，匹配用户ID
		Criteria criteria = Criteria.where("userId").is(userId);
		//2.构造一个查询对象
		//使用之前构建的条件对象创建一个查询对象
		Query query = new Query(criteria);
		//3.查询
		Sort sort = Sort.by(Sort.Direction.DESC, "updateTime");
		query.with(sort);
		//4.获取结果
		String collectionName = MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId);
		UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, collectionName);
		if (userListenProcess != null){
			result.put("trackId", userListenProcess.getTrackId());
			result.put("albumId", userListenProcess.getAlbumId());
			return result;
		}
		return new HashMap<>();
    }
}
